home *** CD-ROM | disk | FTP | other *** search
- /* Copyright (c) 1990 by Sozobon, Limited. Authors: Johann Ruegg, Don Dugger
- *
- * Permission is granted to anyone to use this software for any purpose
- * on any computer system, and to redistribute it freely, with the
- * following restrictions:
- * 1) No charge may be made other than reasonable charges for reproduction.
- * 2) Modified versions must be clearly marked as such.
- * 3) The authors are not responsible for any harmful consequences
- * of using this software, even if they result from defects in it.
- *
- * trace.c
- */
-
- #include <setjmp.h>
- #include "adb.h"
-
- #define IN_TRACE
- #include "lang.h"
-
- extern int trap2(), trap3(), trap4(), trap5(), trap6(),
- trap7(), trap8(), trap9(), trapx();
-
- int myvecs;
- int running;
- int lasttrap;
-
- struct vlist {
- int number;
- int (*vector)();
- long oldv;
- } vlist[] = {
- {2, trap2},
- {3, trap3},
- {4, trap4},
- {5, trap5},
- {6, trap6},
- {7, trap7},
- {8, trap8},
- {9, trap9},
- {0x102, trapx},
- {0, 0}
- };
-
- jmp_buf xqt_buf;
- extern jmp_buf trp_buf;
-
- long
- ptrace(req, pid, addr, data)
- int req, pid;
- long *addr;
- long data;
- {
- extern struct regs regs[];
- extern int xqt();
- extern long gemdos();
-
- switch (req) {
-
- case RD_TEXT:
- case RD_DATA:
- if ((int)addr & (sizeof(data) - 1))
- return(-1);
- data = *addr;
- return(data);
- case WR_TEXT:
- case WR_DATA:
- if ((int)addr & (sizeof(data) - 1))
- return(-1);
- *addr = data;
- return(data);
- case SSTEP:
- *(regs[SR].value) = (*(regs[SR].value) & ~TBITS) | ITRACE;
- xqt();
- return(0);
- case CONTINUE:
- *(regs[SR].value) = *(regs[SR].value) & ~TBITS;
- xqt();
- return(0);
- case START_DBG:
- return(0);
- case RD_USER:
- case WR_USER:
- return(-1);
-
- }
- return(-1);
- }
-
- xqt()
- {
- running = 1;
- if (setjmp(xqt_buf) == 0)
- go();
- running = 0;
- return;
- }
-
- int detail, be_instr;
- long be_addr;
-
- prbuserr()
- {
- prtf("trap: %s\n", tnm[lasttrap]);
- prtf("%s %c ", fcnm[detail & 7],
- (detail & 0x10) ? 'r' : 'w');
- if (detail & 8)
- /* prt("(not instr) "); */
- prt(M1);
- /* prtf("addr %I instr %i\n", */
- prtf(M2,
- be_addr, be_instr);
- }
-
- trap(type, sr, pc)
- unsigned int type, sr;
- unsigned long pc;
- {
- extern struct regs regs[];
-
- if (!running) {
- /* prt("internal trap: "); */
- prt(M3);
- prt(tnm[type]);
- putchr('\n');
- longjmp(trp_buf, 1);
- }
- *(regs[SR].value) = (unsigned long)sr;
- *(regs[PC].value) = pc;
- lasttrap = type;
- longjmp(xqt_buf, 1);
- }
-
- vects()
- {
- long bios();
- struct vlist *vp;
-
- vp = vlist;
- while (vp->number) {
- vp->oldv = bios(5, vp->number, vp->vector);
- vp++;
- }
- myvecs = 1;
- }
-
- oldvects()
- {
- struct vlist *vp;
-
- if (!myvecs)
- return;
- vp = vlist;
- while (vp->number) {
- bios(5, vp->number, vp->oldv);
- vp++;
- }
- myvecs = 0;
- }
-